package com.sugon.aop;

import com.sugon.utils.SpringContextUtils;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.util.ThreadContext;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 数据过滤，切面处理类
 * 校验当前线程中是否含有SecurityManager对象，如果没有则进行设置
 * 防止出现县城内如果用到该对象不存在时抛出空异常的问题
 *
 * @author YuXD
 * @date 2020-08-03 11:47
 */
@Aspect
@Component
public class ShiroSecurityManagerCheckerAspect {

    /**
     * 只用作定义查询参数过滤切点，注解注明核心内容
     * 方法体内无需任何实现
     */
    @Pointcut("@annotation(com.sugon.annotation.ShiroSecurityManagerChecker)")
    public void dataFilterCut() {}

    /**
     * dataFilter
     * @param point
     */
    @Before("dataFilterCut()")
    public void dataFilter(JoinPoint point) {
        SecurityManager securityManager = ThreadContext.getSecurityManager();
        if (securityManager == null) {
            securityManager = SpringContextUtils.getBean("securityManager", DefaultWebSecurityManager.class);
            ThreadContext.bind(securityManager);
        }
    }

}
